#include <stdio.h>
#include <string.h>
#include "vector_dinamico.h"
#include "dir_explorer.h"

#define VOLUMEN 50
#define PATH "./test"
#define PATH2 "/etc"

/* ******************************************************************
 *                      FUNCIONES AUXILIARES
 * *****************************************************************/

/* Función auxiliar para imprimir si estuvo OK o no. */
void print_test(char* name, bool result)
{
    printf("%s: %s\n", name, result? "OK" : "ERROR");
}

void print_msj(char* msj){

	printf("\n\n%s\n\n",msj);

}

bool archivo_encontrado(char* archivo){

	char* elementos[6] = {"./test/.svn","./test/folder","./test/doc.txt","./test/doc2.c","./test/doc3.h","./test/doc4.txt"};

	for ( int i = 0 ; i < 6 ; i++ ){

		if (strcmp(archivo,elementos[i]) == 0)
			return true;

	}

	return false;
}

/* ******************************************************************
 *                        PRUEBAS UNITARIAS
 * *****************************************************************/

void prueba_extraer_extension(){

	char* ext1 = archivo_extraer_extension("arch.txt");
	char* ext2 = archivo_extraer_extension("arch.txt.c");
	char* ext3 = archivo_extraer_extension("arch.txt.tar.gz");
	char* ext4 = archivo_extraer_extension("arch.c");
	char* ext5 = archivo_extraer_extension("arch");

	print_test("La extencion de arch.txt es txt", strcmp(ext1,"txt") == 0);
	print_test("La extencion de arch.txt.c es c", strcmp(ext2,"c") == 0);
	print_test("La extencion de arch.txt.tar.gz es gz", strcmp(ext3,"gz") == 0);
	print_test("La extencion de arch.c es c", strcmp(ext4,"c") == 0);
	print_test("La extencion de arch es vacio", strcmp(ext5,"") == 0);

	free (ext1);
	free (ext2);
	free (ext3);
	free (ext4);
	free (ext5);


}


void prueba_creacion_filtro(){

	filtro_archivos_t* filtro = filtro_archivos_crear();
	filtro_archivos_destruir(filtro);

	filtro = filtro_archivos_crear();
	char* txt = "txt";
	filtro_archivos_agregar_extension(filtro,txt);
	int cant;
	char** extensiones = filtro_archivos_obtener_extensiones(filtro,&cant);

	print_test("El largo de la extension agregada es igual a la que se obtiene",strlen(extensiones[0]) == strlen(txt));
	print_test("La extension agregada es txt",strcmp(extensiones[0],txt) == 0);

	for (int i = 0; i < cant; i++)
		free(extensiones[i]);
	free(extensiones);
	filtro_archivos_destruir(filtro);
}


void prueba_carga_extensiones(){

	filtro_archivos_t* filtro = filtro_archivos_crear();
	bool ok = true;
	int cant;

	char* ext = "txt";

	for (int i = 0; i < VOLUMEN; i++){
		if (!filtro_archivos_agregar_extension(filtro,ext))
			ok = false;
	}

	print_test("Carga de volumen de extensiones", ok);

	char** exts = filtro_archivos_obtener_extensiones(filtro,&cant);

	print_test("Cantidad de extensiones cargadas correcta", cant == VOLUMEN);

	ok = true;

	for (int i = 0; i < cant; i++){
		if (strcmp(exts[i],ext) != 0)
			ok = false;
		free(exts[i]);
	}

	print_test("Extensiones obtenidas correctamente", ok);

	free(exts);
	filtro_archivos_destruir(filtro);
}


void prueba_dir_explorer(){

	int cant = 0;

	vector_t* archivos = dir_obtener_archivos(PATH, &cant);

	print_test("Cantidad de elementos registrada es correcta", cant == 6);

	print_test("El primer elemento es correcto", archivo_encontrado(vector_obtener(archivos, 0)));
	printf("El primer elemento es: %s\n",(char*)vector_obtener(archivos, 0));

	print_test("El segundo elemento es correcto", archivo_encontrado(vector_obtener(archivos, 1)));
	printf("El segundo elemento es: %s\n",(char*)vector_obtener(archivos, 1));

	print_test("El tercer elemento es correcto", archivo_encontrado(vector_obtener(archivos, 2)));
	printf("El tercer elemento es: %s\n",(char*)vector_obtener(archivos, 2));

	print_test("El cuarto elemento es correcto", archivo_encontrado(vector_obtener(archivos, 3)));
	printf("El cuarto elemento es: %s\n",(char*)vector_obtener(archivos, 3));

	print_test("El quinto elemento es correcto", archivo_encontrado(vector_obtener(archivos, 4)));
	printf("El quinto elemento es: %s\n",(char*)vector_obtener(archivos, 4));

	print_test("El sexto elemento es correcto", archivo_encontrado(vector_obtener(archivos, 5)));
	printf("El sexto elemento es: %s\n",(char*)vector_obtener(archivos, 5));


	for (int i = 0 ; i < cant; i++){

		char* archivo = vector_obtener(archivos,i);
		free(archivo);

	}

	vector_destruir(archivos,NULL);

}


void prueba_filtro(){

	int cant = 0;
	int cant_filt = 0;

	vector_t* archivos = dir_obtener_archivos(PATH, &cant);

	filtro_archivos_t* filtro = filtro_archivos_crear();
	char* txt = "txt";
	filtro_archivos_agregar_extension(filtro,txt);

	print_test("Cantidad de elementos registrada es correcta", cant == 6);

	cant_filt = cant;

	vector_t* filtrado = filtro_archivos_filtrar(filtro,archivos,&cant_filt);

	print_test("Cantidad de elementos filtrada es correcta", cant_filt == 2);

	char* ext = archivo_extraer_extension(vector_obtener(filtrado,0));
	print_test("La extension del primer archivo es txt", strcmp(ext,txt) == 0);
	printf("El primer elemento filtrado es: %s\n",(char*)vector_obtener(filtrado, 0));
	free(ext);

	ext = archivo_extraer_extension(vector_obtener(filtrado,1));
	print_test("La extension del segundo archivo es txt", strcmp(ext,txt) == 0);
	printf("El segundo elemento filtrado es: %s\n",(char*)vector_obtener(filtrado, 1));
	free(ext);



	vector_destruir_con_elementos(filtrado,free,cant_filt);

	filtro_archivos_destruir(filtro);
}

void prueba_filtro2(){

	int cant = 0;
	int cant_filt = 0;

	vector_t* archivos = dir_obtener_archivos(PATH, &cant);

	filtro_archivos_t* filtro = filtro_archivos_crear();
	char* txt = "txt";
	filtro_archivos_agregar_extension(filtro,txt);

	char* c = "c";
	filtro_archivos_agregar_extension(filtro,c);

	cant_filt = cant;

	vector_t* filtrado = filtro_archivos_filtrar(filtro,archivos,&cant_filt);

	print_test("Cantidad de elementos filtrada es correcta", cant_filt == 3);

	char* ext = archivo_extraer_extension(vector_obtener(filtrado,0));
	bool result = (strcmp(ext,txt) == 0) || (strcmp(ext,c) == 0);
	print_test("La extension del primer archivo es txt", result);
	printf("El primer elemento filtrado es: %s\n",(char*)vector_obtener(filtrado, 0));
	free(ext);

	ext = archivo_extraer_extension( (char*) vector_obtener(filtrado,1));
	result = (strcmp(ext,txt) == 0) || (strcmp(ext,c) == 0);
	print_test("La extension del segundo archivo es txt", result);
	printf("El segundo elemento filtrado es: %s\n",(char*)vector_obtener(filtrado, 1));
	free(ext);

	ext = archivo_extraer_extension(vector_obtener(filtrado,2));
	result = (strcmp(ext,txt) == 0) || (strcmp(ext,c) == 0);
	print_test("La extension del segundo archivo es txt", result);
	printf("El tercer elemento filtrado es: %s\n",(char*)vector_obtener(filtrado, 2));
	free(ext);



	vector_destruir_con_elementos(filtrado,free,cant_filt);

	filtro_archivos_destruir(filtro);


}


void prueba_explorador_intensiva(){

	int cant = 0;

	vector_t* archivos = dir_obtener_archivos(PATH2, &cant);

	for (int i = 0; i < cant ; i++){
		printf("El elemento %d es: %s\n",i,(char*)vector_obtener(archivos, i));
		free(vector_obtener(archivos, i));
	}

	vector_destruir(archivos,NULL);




}


/* ******************************************************************
 *                        PROGRAMA PRINCIPAL
 * *****************************************************************/

/* Programa principal. */
int main(int argc, char** argv){

	print_msj("Prueba Extension");
	prueba_extraer_extension();
	print_msj("Prueba Creacion Filtro");
	prueba_creacion_filtro();
	print_msj("Prueba Carga de Extensiones");
	prueba_carga_extensiones();
	print_msj("Prueba Explorer Directorio");
	prueba_dir_explorer();
	print_msj("Prueba Filtro1");
	prueba_filtro();
	print_msj("Prueba Filtro2");
	prueba_filtro2();
	print_msj("Prueba Explorador Intensiva");
	prueba_explorador_intensiva();
	print_msj("FIN");

	return 0;
}
